package condominio.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.excepcion.DAOExcepcion;
import condominio.modelo.Queja;
import condominio.util.*;

public class QuejaDAO extends BaseDAO {
	
	public void insertarRegQueja(Queja objQueja) throws DAOExcepcion {
		char chrAux;
		System.out.println("insertarRegQueja(Queja objQueja)");
		String query = "INSERT INTO QUEJA (que_fecha, que_vivienda_reg, que_desc, que_estado, que_tipo_origen, que_causante, que_atencion_respon, que_atencion_leido, que_atencion_rpta) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
// fecha de registro es hoy. No se utiliza metodo getDatFechaQueja; recibe null
			java.sql.Date datFechaHoy = ManejoFechas.obtenerFechaActualSQL();
			stmt.setDate(1, datFechaHoy);
			stmt.setInt(2, objQueja.getIntViviendaReg());
			stmt.setString(3, objQueja.getStrDescripcion());
// estado de la queja
			chrAux = objQueja.getChrEstadoQueja();
			stmt.setString(4, Character.toString(chrAux));
// tipo de origen					
			chrAux = objQueja.getChrTipoOrigen();
			stmt.setString(5, Character.toString(chrAux));
			stmt.setString(6, objQueja.getStrCausante());
			stmt.setString(7, objQueja.getStrAtencionResp());
// flag de queja leida por el admin
			chrAux = objQueja.getChrFlagLeido();
			stmt.setString(8, Character.toString(chrAux));
			stmt.setString(9, objQueja.getStrRespuesta());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("Error. No se pudo insertar registro en table QUEJA");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Queja obtenerQuejaPorCodigo(int pNroQueja) throws DAOExcepcion {
		String strAux;
//		System.out.println("obtenerQuejaPorCodigo(int pNroQueja)");
		Queja objQueja = new Queja();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT que_id, que_fecha, que_vivienda_reg, que_desc, que_estado, que_tipo_origen, que_causante, que_atencion_respon, que_atencion_leido, que_atencion_rpta FROM QUEJA WHERE que_id = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, pNroQueja);
			rs = stmt.executeQuery();
			if (rs.next()) {
				objQueja.setIntIDQueja(rs.getInt(1));
				objQueja.setDatFechaQueja(rs.getDate(2));
				objQueja.setIntViviendaReg(rs.getInt(3));
				objQueja.setStrDescripcion(rs.getString(4));
				strAux = rs.getString(5);
				objQueja.setChrEstadoQueja(strAux.charAt(0));
				strAux = rs.getString(6);
				objQueja.setChrTipoOrigen(strAux.charAt(0));
				objQueja.setStrCausante(rs.getString(7));
				objQueja.setStrAtencionResp(rs.getString(8));
				strAux = rs.getString(9);
				objQueja.setChrFlagLeido(strAux.charAt(0));
				objQueja.setStrRespuesta(rs.getString(10));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objQueja;
	}

//	public Collection<Queja> buscarQuejasPorViviendaRegistro(int pCodVivienda) throws DAOExcepcion {
	public Collection<Queja> buscarQuejasPorResidente(String pIdResidente) throws DAOExcepcion {
		String strAux;
//		String query = "SELECT que_id, que_fecha, que_vivienda_reg, que_desc, que_estado, que_tipo_origen, que_causante, que_atencion_respon, que_atencion_leido, que_atencion_rpta FROM QUEJA WHERE que_vivienda_reg = ?";
		
		String query = "SELECT que_id, que_fecha, que_vivienda_reg, viv_id_residente, que_desc, que_estado, que_tipo_origen, que_causante, que_atencion_respon, " + 
		"que_atencion_leido, que_atencion_rpta " +
		"FROM QUEJA, VIVIENDA " +
		"WHERE QUEJA.que_vivienda_reg = VIVIENDA.viv_id AND VIVIENDA.viv_id_residente = ?";
		
		Collection<Queja> lista = new ArrayList<Queja>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, pIdResidente);     // si no selecciona registros de quejas aqui puede estar la falla. se esta usando setstring para parametro q selecciona sobre campo int 
			rs = stmt.executeQuery();
			while (rs.next()) {
				Queja objQueja = new Queja();
				objQueja.setIntIDQueja(rs.getInt(1));
				objQueja.setDatFechaQueja(rs.getDate(2));
				objQueja.setIntViviendaReg(rs.getInt(3));
				objQueja.setIntIdResidente(rs.getInt(4));
				objQueja.setStrDescripcion(rs.getString(5));
				strAux = rs.getString(6);
				objQueja.setChrEstadoQueja(strAux.charAt(0));
				strAux = rs.getString(7);
				objQueja.setChrTipoOrigen(strAux.charAt(0));
				objQueja.setStrCausante(rs.getString(8));
				objQueja.setStrAtencionResp(rs.getString(9));
				strAux = rs.getString(10);
				objQueja.setChrFlagLeido(strAux.charAt(0));
				objQueja.setStrRespuesta(rs.getString(11));
				lista.add(objQueja);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public void actualizarQuejaFlagLeido(int pNroQueja) throws DAOExcepcion {
		System.out.println("actualizarQuejaFlagLeido(Queja pObjQueja)");
		String query = "UPDATE QUEJA SET que_atencion_leido = 'L' WHERE que_id = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, pNroQueja);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar indicador de 'Leido' en el registro de la Queja " + pNroQueja);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<Queja> listarQuejas() throws DAOExcepcion {
		String strAux;
		System.out.println("listarQuejas()");
		Collection<Queja> c = new ArrayList<Queja>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
//			String query = "SELECT gar_id, gar_area, gar_tipo, gar_id_vivienda FROM GARAJE;";
			String query = "SELECT que_id, que_fecha, que_vivienda_reg, que_desc, que_estado, que_tipo_origen, que_causante, que_atencion_respon, que_atencion_leido, que_atencion_rpta FROM QUEJA ORDER BY que_id";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Queja objQueja = new Queja();
				objQueja.setIntIDQueja(rs.getInt("que_id"));
				objQueja.setDatFechaQueja(rs.getDate("que_fecha"));
				objQueja.setIntViviendaReg(rs.getInt("que_vivienda_reg"));
				objQueja.setStrDescripcion(rs.getString("que_desc"));
				strAux = rs.getString("que_estado");
				objQueja.setChrEstadoQueja(strAux.charAt(0));
				strAux = rs.getString("que_tipo_origen");
				objQueja.setChrTipoOrigen(strAux.charAt(0));
				objQueja.setStrCausante(rs.getString("que_causante"));
				objQueja.setStrAtencionResp(rs.getString("que_atencion_respon"));
				strAux = rs.getString("que_atencion_leido");
				objQueja.setChrFlagLeido(strAux.charAt(0));
				objQueja.setStrRespuesta(rs.getString("que_atencion_rpta"));
				c.add(objQueja);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

}
